<?php
class Inputs {
	// validation
	static private function validate_int($number, $min_range, $max_range) {
		$options = array (
				'min_range' => $min_range,
				'max_range' => $max_range
		);

		if (filter_var ( $number, FILTER_VALIDATE_INT, $options ) === false) {
			return false;
		}
		return true;
	}
	static private function validate_mail($email) {
		if (filter_var ( $email, FILTER_VALIDATE_EMAIL )) {
			return true;
		}
		return false;
	}
	/*// solo letras mayusculas y minusculas con espacio
	static private function validate_words($string) {
		if (ereg ( "/^[a-zA-Z]*$/", $cadena )) {
			return true;
		}
		return false;
	}*/
	// solo numeross con espacio
	static private function validate_numbers($number) {
		if (preg_match( "/^[0-9]$/", $number )) {
			return true;
		}
		return false;
	}
	// letras y numeros con espacio
	static private function validate_numbers_strings($name) {
		if (preg_match("/^[a-zA-Z ]+$/",$name)) {
			return true;
		}
		return false;
	}
	static private function is_string_number(&$input){
		
			if($input!=null && is_string($input)){
				return true;
			}
		
		return false;
	}
	// valida longitud string
	static function validate_long($string, $min, $max) {
		if (strlen ( $string ) >= $min || strlen ( $string ) <= $max) {
				
			return true;
		}
		return false;
	}
	// sanitize
	static private function sanitize_int($number) {
		return filter_var ( $number, FILTER_SANITIZE_NUMBER_INT );
	}
	static private function  sanitize_specialchars_string(&$string) {
		filter_var ( $string, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH );
	}
	static private function  sanitize_string(&$string) {
		$string=addslashes($string);
		$string=quotemeta($string);

	}
	//creacion de excepción personalizada
	static private function resultado_validacion($bool,$message){
		if ($bool === false) {
			throw new Exception ( $message );
		}
	}
	
	static private function validate_id($id){
		return MongoId::isValid($id);
	}
	static private function validate_sesion($sesion){
		
		if (preg_match("/^(0[1-9]|1\d|2[0-3]):([0-5]\d)$/",$sesion)) {
			return true;
		}
		return false;
	}
	
	// VALIDACION OBRAS
	//--------------------------------------------------------------------------------------------
	
	//campos
	static function validate_obra_id(&$id) {
		$validacion = self::validate_id($id);
		// validar tipo de dato(string, int, etc)
		
		self::resultado_validacion($validacion,"id obra no valido");
	}
	
	static function validate_obra_nombre_obra(&$nombre_obra) {
		$validacion = true;
		// validar tipo de dato(string, int, etc)
		$validacionstring=self::is_string_number($nombre_obra);

		// desinfectar(comillas, slashes,etc)
		self::sanitize_specialchars_string($nombre_obra);
		self::sanitize_string($nombre_obra);
		// validacion especifica del campo (longitud, valores esperados)
		$validacionlong=self::validate_long($nombre_obra, 3, 30);
		$validacion=$validacionstring && $validacionlong;
		self::resultado_validacion($validacion,"Nombre obra no valido");
	}
	static function validate_obra_nombre_teatro(&$nombre_teatro) {
		$validacion = true;
		// validar tipo de dato(string, int, etc)
		$validacionstring=self::is_string_number($nombre_teatro);
		
		// desinfectar(comillas, slashes,etc)
		self::sanitize_specialchars_string($nombre_teatro);
		self::sanitize_string($nombre_teatro);
		// validacion especifica del campo (longitud, valores esperados)
		$validacionlong=self::validate_long($nombre_teatro, 3, 30);
		
		$validacion=$validacionstring && $validacionlong;
		
		self::resultado_validacion($validacion,"Nombre teatro no valido");
	}
	static function validate_obra_descripcion(&$nombre_descripcion) {
		$validacion = true;
		// validar tipo de dato(string, int, etc)
		$validacionstring=self::is_string_number($nombre_descripcion);
		
		// desinfectar(comillas, slashes,etc)
		self::sanitize_specialchars_string($nombre_descripcion);
		self::sanitize_string($nombre_descripcion);
		// validacion especifica del campo (longitud, valores esperados)
		$validacionlong=self::validate_long($nombre_descripcion, 10, 250);
		$validacion=$validacionstring && $validacionlong;
		self::resultado_validacion($validacion,"descripcion no valida");
	}

	static function validate_obra_sesion(&$sesion) {

		// validar tipo de dato(string, int, etc)
		$validacionstring=self::is_string_number($sesion);
	    
		// desinfectar(comillas, slashes,etc)
		self::sanitize_specialchars_string($sesion);
		self::sanitize_string($sesion);
		$validacionsesion=self::validate_sesion($sesion);
		// validacion especifica del campo (longitud, valores esperados)
		$validacionlong=self::validate_long($sesion, 5, 5);
		$validacion=$validacionstring && $validacionlong && $validacionsesion;
		self::resultado_validacion($validacion,"sesion no valida");
	}
	 static function validate_obra_nfilas(&$nfilas) {
		$validacion = false;
		// validar tipo de dato(string, int, etc)
		$validacionstring=self::is_string_number($nfilas);
		 
		// desinfectar(comillas, slashes,etc)
		self::sanitize_specialchars_string($nfilas);
		self::sanitize_string($nfilas);
		// validacion especifica del campo (longitud, valores esperados)
		$validacionnumber=self::validate_numbers($nfilas);
		$validacionlong=self::validate_long($nfilas, 1, 2);
		$validacion=$validacionstring && $validacionlong && $nfilas;
		self::resultado_validacion($validacion,"filas no validas");
	}
	static function validate_obra_nasientos(&$nasientos) {
		$validacion = true;
		// validar tipo de dato(string, int, etc)
		$validacionstring=self::is_string_number($nasientos);
			
		// desinfectar(comillas, slashes,etc)
		self::sanitize_specialchars_string($nasientos);
		self::sanitize_string($nasientos);
		// validacion especifica del campo (longitud, valores esperados)
		$validacionnumber=self::validate_numbers($nasientos);
		$validacionlong=self::validate_long($nasientos, 1, 2);
		$validacion=$validacionstring && $validacionlong && $nasientos;
		self::resultado_validacion($validacion,"asientos no validas");
	}
	static function validate_obra_comentario(&$comentario) {
		self::sanitize_string($comentario);
		$validacion=self::validate_long($comentario, 1, 500);
		
		self::resultado_validacion($validacion,"comentario no valido");
	}
	static function validate_obra_puntuacion(&$puntuacion) {
		$validacion=self::validate_int($puntuacion,1,5);
		
		self::resultado_validacion($validacion,"puntuacion no valida");
	}
	static function validate_obra_orden(&$orden) {
		
		$ordenes=array("fecha","puntuacion");
		$validacion = in_array($orden, $ordenes);
		self::resultado_validacion($validacion,"orden no valido");
	}
	static function validate_obra_busqueda(&$busqueda) {
		$validacion=true;
		self::resultado_validacion($validacion,"orden no valido");
	}
	
	
	
	
	//acciones
	static function validate_obra_nueva(&$nombre_teatro, &$nombre_obra, &$descripcion,&$sesion1,&$sesion2,&$sesion3,&$nfilas,&$nasientos) {
		self::validate_obra_nombre_teatro ( $nombre_teatro );
		self::validate_obra_nombre_obra ( $nombre_obra );
		self::validate_obra_descripcion ( $descripcion );
		self::validate_obra_sesion($sesion1);
		self::validate_obra_sesion($sesion2);
		self::validate_obra_sesion($sesion3);
		self::validate_obra_nfilas($nfilas);
		self::validate_obra_nasientos($nasientos);
	}
	static function validate_obra_editar(&$id_obra,&$nombre_teatro, &$nombre_obra, &$descripcion,&$sesion1,&$sesion2,&$sesion3,&$nfilas,&$nasientos) {
		self::validate_obra_id ( $id_obra );
		self::validate_obra_nombre_teatro ( $nombre_teatro );
		self::validate_obra_nombre_obra ( $nombre_obra );
		self::validate_obra_descripcion ( $descripcion );
		self::validate_obra_sesion($sesion1);
		self::validate_obra_sesion($sesion2);
		self::validate_obra_sesion($sesion3);
		self::validate_obra_nfilas($nfilas);
		self::validate_obra_nasientos($nasientos);
	}
	
	static function validate_obra_recuperar_obra(&$id_obra,&$orden,&$sesion,&$dia) {
		self::validate_obra_id ( $id_obra );
		self::validate_obra_orden($orden);
		self::validate_entradas_nsesion($sesion);
		self::validate_entradas_dia($dia);
	}
	static function validate_obra_valoracion(&$id_obra,&$puntuacion,&$comentario) {
		self::validate_obra_id ( $id_obra );
		self::validate_obra_comentario($comentario);
		self::validate_obra_puntuacion($puntuacion);
	}
	
	
	
	//-------------------------------------------------------------------------------------------------------
	
	// VALIDAR ENTRADA
	//-------------------------------------------------------------------------------------------------------
	
	//campos
	static function validate_entradas_nsesion(&$nsesion){
		$validacion=self::validate_int($nsesion,1,3);
		self::resultado_validacion($validacion,"numero de sesion no valido");
	}
	static function validate_entradas_dia(&$dia){
		$validacion=preg_match('/^[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}$/', $fecha);
		self::resultado_validacion($validacion,"Dia no valido");
	}
	
	//acciones
	static function validate_entradas_comprar(&$id_obra, &$nsesion, &$fila, &$asiento, &$dia ){
		self::validate_obra_id($id_obra);
		self::validate_entradas_nsesion($nsesion);
		self::validate_obra_nfilas($fila);
		self::validate_obra_nasientos($asiento);
		self::validate_entradas_dia($dia);
	}
	static function validate_entradas_consultar(&$id_obra, &$nsesion, &$dia ){
		self::validate_obra_id($id_obra);
		self::validate_entradas_nsesion($nsesion);
		self::validate_entradas_dia($dia);
	}
	
	
	//-------------------------------------------------------------------------------------------------------
	
	
	// VALIDAR USUARIO---------------------------------------------------------------------------------------
	
	//campos
	static function validate_usuario_dni(&$usuario_dni){

		$formato=preg_match('/^(\d{1,8})([A-Z]{1})$/', $usuario_dni);
		
		$letra = substr($usuario_dni, -1);
		$numeros = substr($usuario_dni, 0, -1);
		$dnivalido=substr("TRWAGMYFPDXBNJZSQVHLCKE", $numeros%23, 1) == $letra && strlen($letra) == 1 && strlen ($numeros) <= 8;

		
		$validacion=$formato && $dnivalido;
		self::resultado_validacion($validacion,"DNI no válido");
	}
	
	static function validate_usuario_nombre(&$usuario_nombre){
		$validacion = true;
		// validar tipo de dato(string, int, etc)
		$validacionstring=self::is_string_number($usuario_nombre);
		 
		// desinfectar(comillas, slashes,etc)
		self::sanitize_specialchars_string($usuario_nombre);
		self::sanitize_string($usuario_nombre);
		// validacion especifica del campo (longitud, valores esperados)
		$validacionlong=self::validate_long($usuario_nombre, 1, 15);
		$validacion=$validacionstring && $validacionlong;
		self::resultado_validacion($validacion,"Nombre usuario no valido");
	}
	static function validate_usuario_apellidos(&$usuario_apellidos){
		$validacion = true;
		// validar tipo de dato(string, int, etc)
		$validacionstring=self::is_string_number($usuario_apellidos);
		 
		// desinfectar(comillas, slashes,etc)
		self::sanitize_specialchars_string($usuario_apellidos);
		self::sanitize_string($usuario_apellidos);
		// validacion especifica del campo (longitud, valores esperados)
		$validacionlong=self::validate_long($usuario_apellidos, 1, 70);
		$validacion=$validacionstring && $validacionlong;

		self::resultado_validacion($validacion,"Apellidos no valido");
	}


	static function validate_usuario_email(&$usuario_email){

		$validacion=self::validate_mail($usuario_email);
		
		self::resultado_validacion($validacion,"Email no valido");
	}
	
	static function validate_usuario_nick(&$usuario_nick){
		$validacion = true;
		$validacionstring=self::is_string_number($usuario_nick);
		$validacionnick=self::validate_numbers_strings($usuario_nick);
		// validacion especifica del campo (longitud, valores esperados)
		$validacionlong=self::validate_long($usuario_nick, 1, 15);
		$validacion=$validacionstring && $validacionlong && $validacionnick;		
	
		self::resultado_validacion($validacion,"Nick no valido");
	}
	
	static function validate_usuario_password(&$usuario_password){
		$validacion = true;
	
		$validacionstring=self::is_string_number($usuario_password);
		$validacionlong=self::validate_long($usuario_password, 1, 20);
		$validacion=$validacionstring && $validacionlong;
		
		self::resultado_validacion($validacion,"Password no valido");
		
	}
	static function validate_usuario_rol(&$usuario_rol){
		$validacion = false;

		$roles_validos=array("administrador","cliente");
		$validacion=in_array($usuario_rol, $roles_validos);
		
		self::resultado_validacion($validacion,"Rol no valido");
		
	}
	
	
	
	//acciones
	
	static function validate_usuario_registro(&$usuario_dni,&$usuario_nombre,&$usuario_apellidos,&$usuario_email,&$usuario_nick,&$usuario_password,&$usuario_rol){
		self::validate_usuario_dni($usuario_dni);
		self::validate_usuario_nombre($usuario_nombre);
		self::validate_usuario_apellidos($usuario_apellidos);
		self::validate_usuario_email($usuario_email);
		self::validate_usuario_nick($usuario_nick);
		self::validate_usuario_password($usuario_password);
		self::validate_usuario_rol($usuario_rol);
	}
	
	static function validate_usuario_editar(&$usuario_nombre,&$usuario_apellidos,&$usuario_email,&$usuario_nick,&$usuario_password){
		self::validate_usuario_nombre($usuario_nombre);
		self::validate_usuario_apellidos($usuario_apellidos);
		self::validate_usuario_email($usuario_email);
		self::validate_usuario_nick($usuario_nick);
		if($usuario_password){
			self::validate_usuario_password($usuario_password);
		}
	}
	
	static function validate_usuario_login(&$usuario_nick,&$usuario_password){
		self::validate_usuario_nick($usuario_nick);
		self::validate_usuario_password($usuario_password);
	}
	
	//--------------------------------------------------------------------------------------------------
}